#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#include <unistd.h>
#include <string.h>
// 宏定义，我称为宏替换。
// 在编译时，自动展开宏内容。也就是将宏内容替换到相应位置。
// 这个宏实现2个数相加，a,b是输入参数。宏与函数是不同的概念。
// 编译展开时就是"a + b"
#define MY_DEFINE_ADD(a, b) a + b

// 编译展开时就是"(a + b)"
#define MY_DEFINE_ADD_PRO(a, b) (a + b)

// 把#a转为字符串
// 这里把a转为字符串，并拼接字符串"123". 
#define getname(a) #a "123"

//拼接
#define pinname(a) pin##a

// 因此宏要检察展开后，表达式内容对不对

int main(int argc, char **argv)
{
    int c = MY_DEFINE_ADD(1, 2); // 编译时，展开为：int c = 1 + 2;
    printf("[%s,%d]value = %d\n", __FILE__, __LINE__, c);

    // 备注：  MY_DEFINE_ADD(1, 2) * 3  展开后是   1 + 2 * 3   。而不是   (1 + 2) * 3
    // 得到7
    c = MY_DEFINE_ADD(1, 2) * 3; // 编译时，展开为：int c = 1 + 2 * 3;
    printf("[%s,%d]value = %d\n", __FILE__, __LINE__, c);

    // 备注：  MY_DEFINE_ADD_PRO(1, 2) * 3  展开后是  (1 + 2) * 3
    // 得到9
    c = MY_DEFINE_ADD_PRO(1, 2) * 3; // 编译时，展开为：int c = (1 + 2) * 3;
    printf("[%s,%d]value = %d\n", __FILE__, __LINE__, c);

    printf("[%s,%d]get name = %s\n", __FILE__, __LINE__, getname(abc));

    int pinname(def) = 123;// 展开 int pindef = 123;
    printf("[%s,%d]value = %d\n", __FILE__, __LINE__, pinname(def));
    printf("[%s,%d]value = %d\n", __FILE__, __LINE__, pindef);
    return 1;
}
